import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
import java.lang.reflect.Array;
/**
 * Clase que contiene las carasteristicas de todos los personajes del juego
 * 
 * @author morales ibarra ivan israel 
 */
public class Personaje extends Actor
{
    private int x;
    private int y;
    private float tValor;
    private float tValorS;
    static final int DER  =0;
    static final int IZQ  =1;
    static final int UP   =2;
    static final int DOWN =3;
    
    /**
     * Constructor de la clase personaje
     */
    public Personaje()
    {
      tValor=0;
      tValorS=0;
    }

    /**
     * Regresa el cronometro actual del juego
     * @return    el cronometro actual del juego
     */
    public float dameCrono()
    {
        return tValor;
    }

    
     /**
     * Inicia el cronometro actual del personaje
     *
     */
    public void iniciaTimer()
    {
        Plataforma world=(Plataforma)this.getWorld();       
        Timer crono=world.dameTimer();        
        tValor=(crono.dameTiempo())-tValorS;
    }
    
    /**
     * Actualiza el tiempo actual del cronometro del jugador
     */
    public void actualizaCrono()
    {
       tValorS=((Plataforma)this.getWorld()).dameTimer().dameTiempo();    
    }

    /**
     *Verifica si se hace contacto con un obstaculo
     *
     * @param  dir direccion que se necesita verificar
     * @param  prox proximidad que se requiere verificar
     */
    public boolean checaObstaculo(int dir,int prox)
    {
         boolean band=false;
         int size=0;
         Plataforma world=(Plataforma)getWorld();
       
        List auxD=world.getObjectsAt(getX()+prox,getY(),null); 
        List auxI=world.getObjectsAt(getX()-prox,getY(),null);
        List auxU=world.getObjectsAt(getX(),getY()-prox,null);
        List auxDw=world.getObjectsAt(getX(),getY()+prox,null);
        
        Actor auxD1=getOneObjectAtOffset(prox,0,null); 
        Actor auxI1=getOneObjectAtOffset(-prox,0,null);
        Actor auxU1=getOneObjectAtOffset(0,-prox,null);
        Actor auxDw1=getOneObjectAtOffset(0,prox,null);
        
            
            if(dir==DER)
            {
               size=auxD.size();
               Object[] ob=new Object[size+1];
               ob=auxD.toArray(ob);
               for(int i=0; i<=size; i++)
               {
                    if(Array.get(ob,i)instanceof Obstaculo || auxD1==null)
                     band=true;
               }
            }
                    
            if(dir==IZQ)
            {
               size=auxI.size();
               Object[] ob=new Object[size+1];
               ob=auxI.toArray(ob);
               for(int i=0; i<=size; i++)
               {
                    if(Array.get(ob,i)instanceof Obstaculo || auxI1==null)
              
                   band=true;
               }
            }
            
            if(dir==UP)
            {
               size=auxU.size();
               Object[] ob=new Object[size+1];
               ob=auxU.toArray(ob);
                for(int i=0; i<=size; i++)
               {
                    if(Array.get(ob,i)instanceof Obstaculo || auxU1==null)
              
                   band=true;
               }
            }
            
           if(dir==DOWN)
            {
               size=auxDw.size();
               Object[] ob=new Object[size+1];
               ob=auxDw.toArray(ob);
               for(int i=0; i<=size; i++)
               {
                    if(Array.get(ob,i)instanceof Obstaculo || auxDw1==null)
              
                   band=true;
               }
            }
            //Array.get(ob,i)!=null && 
        return band;
    }
    
    
    /**
     * Verifica el indice de la imagen y lo reinicia
     *
     * @param  lim limite de la imagen
     * @param  var variable que se esta utilizando
     * @param  ini inicio del arreglo
     * @return    la variable modificada
     */
    public int checaIndice(int lim, int var,int ini)
    {
        if(var==lim)
        {
            var=ini;
        }
        return var;
    }
    
    /**
     * Cambia de posicion el obstaculo en el escenario
     *
     * @param  dir direccion nueva
     * @param img arreglo de imagen
     * @param der indice imagen de la derecha
     * @param izq indice imagen de la izquierda
     * @param up indice imagen de arriba
     * @param dw indice imagen de abajo
     * @return     the sum of x and y
     */
    public void mueve(int dir, GreenfootImage[] img, int der, int izq, int up, int dw)
    {
        if(dir==DER)
        {
            if(!checaObstaculo(DER,20))
            {
            setLocation(this.getX()+1,getY());
            setImage(img[der]);
            }
        }
        else if(dir==IZQ)
        {
            if(!checaObstaculo(IZQ,20))
            {
                setLocation(this.getX()-1,getY());
                setImage(img[izq]);
            }
        }
        else if(dir==UP)
        {
            if(!checaObstaculo(UP,20))
            {
            setLocation(this.getX(),getY()-1);
            setImage(img[up]);
            }
        }
        else if(dir==DOWN)
        {
            if(!checaObstaculo(DOWN,20))
            {
            setLocation(this.getX(),getY()+1);
            setImage(img[dw]);
            }
        }
    }
    
       
    }
    
    
 
